package com.powernode.sqlinjection;

import com.powernode.commons.util.DbUtils;

import java.sql.*;
import java.util.Scanner;

@SuppressWarnings("all")
/**
 * @Author Arrebol
 * @Date 2024/8/1 22:02
 * @Project jdbc
 * @Description：
 * 使用PreparedStatement解决SQL注入问题
 */
public class JdbcTestSolvingSqlInjection {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = DbUtils.getConnection();
            //获取预编译的数据库操作对象
            //在使用预编译的数据库操作对象时，需要先编写SQL语句，然后再获取操作对象
            //这里编写的SQL语句中所有值的位置都需要使用占位符 ? 代替
            String querySql="select * from t_user where username = ? and password = ?";
            ps = conn.prepareStatement(querySql);
            System.out.println("请输入用户名和密码");
            var sc = new Scanner(System.in);
            String username = sc.nextLine();
            String password = sc.nextLine();
            //下面需要给 ? 占位符传递值
            //在JDBC中所有下标都是从 1 开始
            ps.setString(1,username);
            ps.setString(2,password);
            System.out.println("执行的SQL语句为：" + querySql);
            rs = ps.executeQuery();
            //如果结果集中有数据，即登录成功
            if (!rs.next()) {
                System.out.println("用户名或密码错误，登录失败");
            } else {
                System.out.println("登录成功！");
                System.out.println("欢迎用户 " + rs.getString("username"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.close(rs, ps, conn);
        }
    }
}
